package com.gep.session.impl;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.hibernate.ejb.HibernateEntityManager;

import com.gep.dto.EquipamentoDTO;
import com.gep.dto.GrupoDTO;
import com.gep.entity.Equipamento;
import com.gep.session.EquipamentoBORemota;
import com.gep.util.Conversor;

@Stateless(mappedName = "ejb/gep/EquipamentoBORemota")
public class EquipamentoBO implements EquipamentoBORemota {

	private static final Logger LOGGER = Logger
			.getLogger(EquipamentoBORemota.class);

	@PersistenceContext
	private EntityManager em;

	public List<EquipamentoDTO> buscarEquipamentos(EquipamentoDTO equipamentoDTO) {
		List<EquipamentoDTO> equipamentosDto = new ArrayList<EquipamentoDTO>();
		List<Equipamento> equipamentos;

		if (equipamentoDTO.getGrupoDTO() == null) {
			equipamentoDTO.setGrupoDTO(new GrupoDTO());
		}

		Equipamento equipamentoBuscado = new Equipamento();
		equipamentoBuscado = (Equipamento) Conversor.converter(equipamentoDTO,
				equipamentoBuscado.getClass().getName());
		equipamentos = this.buscarEquipamentosEntity(equipamentoBuscado);

		for (Equipamento equipamento : equipamentos) {

			EquipamentoDTO dto = (EquipamentoDTO) Conversor.converter(
					equipamento, new EquipamentoDTO().getClass().getName());
			equipamentosDto.add(dto);

		}

		return equipamentosDto;

	}

	@SuppressWarnings("unchecked")
	private List<Equipamento> buscarEquipamentosEntity(Equipamento equipamento) {
		Criteria criteria;
		List<Equipamento> list;
		Session session;

		HibernateEntityManager hem;

		hem = (HibernateEntityManager) this.em.getDelegate();
		session = hem.getSession();
		criteria = session.createCriteria(Equipamento.class);
		if (equipamento.getCodEquipamento() != null) {
			criteria.add(Restrictions.idEq(equipamento.getCodEquipamento()));
		}
		if (equipamento.getCodEquipamentoEmp() != null) {
			if (equipamento.getCodEquipamentoEmp().length() != 0) {
				criteria.add(Restrictions.eq("codEquipamentoEmp", equipamento
						.getCodEquipamentoEmp()));
			}
		}
		if (equipamento.getNomeEquipamento() != null) {
			if (equipamento.getNomeEquipamento().length() != 0) {
				criteria.add(Restrictions.eq("nomeEquipamento", equipamento
						.getNomeEquipamento()));
			}
		}
		if (equipamento.getGrupo().getCodGrupo() != null) {
			criteria.add(Restrictions.eq("grupo", equipamento.getGrupo()));
		}
		list = criteria.list();
		return list;
	}
	
	public List<EquipamentoDTO> buscarTodosEquipamentos(){
		Query query = em.createQuery("FROM Equipamento e");
		List<Equipamento> equipamentos = query.getResultList();
		List<EquipamentoDTO> listaDTO = new ArrayList<EquipamentoDTO>();
		for (Equipamento equipamento : equipamentos) {

			EquipamentoDTO dto = (EquipamentoDTO) Conversor.converter(
					equipamento, new EquipamentoDTO().getClass().getName());
			listaDTO.add(dto);

		}

		return listaDTO;
		
	}

	public void apagarEquipamento(EquipamentoDTO equipamentoDTO) {
		Equipamento equipamento = (Equipamento) Conversor.converter(
				equipamentoDTO, new Equipamento().getClass().getName());
		equipamento = em.find(equipamento.getClass(), equipamento
				.getCodEquipamento());
		em.remove(equipamento);
	}

	public void salvarEquipamento(EquipamentoDTO equipamentoDTO) {
		Equipamento equipamento = (Equipamento) Conversor.converter(
				equipamentoDTO, new Equipamento().getClass().getName());
		if (equipamento.getCodEquipamento() == null) {
			this.em.persist(equipamento);
		} else {
			this.em.merge(equipamento);
		}
	}
}
